
var classNum = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var classArr = new Array();
var classLog = new Array();
var inputFlg = 0;


// 出题按钮
function setGameBtn(level) {
    $('#opt2').show();
    $('#nums').show();
    $('#drow').hide();
}

// 设置数独
function setGame(level) {
    $('#sdtab td').removeClass('act').removeClass('c1Org');
    $('#opt2').hide();
    classLog = new Array();
    //打乱数字；
    classNum.sort(function() {
        return Math.random() > 0.5 ? -1 : 1;
    }); 
    for (i = 0; i < 9; i += 3) {
        classArr[i / 3] = classNum.slice(i, i + 3);
    }
    var S = new Array();
    S[0] = new Array();
    for (i = 0; i < 3; i++) {
        classArr.unshift(classArr.pop());
        S[0][i] = new Array();
        S[0][i] = classArr.slice(0, 4);
    }
    for (i = 1; i < 3; i++) {
        S[i] = new Array();
        for (m = 0; m < 3; m++) {
            S[i][m] = new Array();
            for (n = 0; n < 3; n++) {
                var _arr = S[i - 1][m][n].slice(0, 4);
                _arr.unshift(_arr.pop());
                S[i][m][n] = _arr; 
            }
        }
    }
    var arr = S.toString().split(','), tds = $('#sdtab td');
    for(i=0; i<81; i++){
        var td = $(tds).eq(i), val = arr[i], ilev = Math.random()>level;
        if(ilev){
            $(td).text(val).addClass('c1').addClass('c1Org').removeAttr('rel').unbind("click");
        }else{
            $(td).text('-').removeClass('c1').attr('rel', val);
            $(td).click(function(){
                optCell(this);
            });
        }
    }
    setInfo(); 
}
// 统计信息
function setInfo(){
    var norg = $('#sdtab td.c1Org').length,
        blank = 81 - norg;
    $('#info').html("完成["+classLog.length+"/"+blank+"] + ["+norg+"]提示");
}

// 录题Start
function inpStart(){
    inputFlg = 1;
    $('#sdtab td').text('-').removeClass('c1').removeClass('c1Org').removeAttr('rel').click(function(){
        optCell(this);
    });
    $('#info').html("请仔细录提！");
}
// 结束End
function inpEnd(){
    classLog = new Array();
    var tds = $('#sdtab td'), cnt = 0;
    for(var i=0; i<81; i++){
        var td = $(tds).eq(i), val = $(td).text();
        if(val!='-'){
            cnt++;
            $(td).addClass('c1').addClass('c1Org').removeAttr('rel').unbind("click");
        }
    }
    if(cnt<17){ 
        $('#info').html("题目还未录完!"); 
        alert('题目还未录完!'); 
        return; 
    }
    $('#opt2').hide();
    inputFlg = 0;
    setInfo();
}

// End结束Game
function endGame(){ 
    //
    var tds = $('#sdtab td');
    for(var i=0; i<81; i++){
        var td = $(tds).eq(i), val = $(td).text();
        if(val=='-' || val.length!=1 || !$(td).hasClass('c1')){
            actCell(td);
            return;
        }
        var err = chkOne(td, val, 1);
        if(err){
            actCell(td);
            return;
        }
    }
    var norg = $('#sdtab td.c1Org').length;
    $('#onCnt').text(81-norg);
    opDialog('dtipOk');
    setInfo();
}


// 设置一个数
function setOne(elm){ 
    var cell = $('#sdtab').find('td.act'), val = $(elm).text(); 
    var vold = $(cell).text();
    if(val.indexOf('-')==0){ // -5
        $(cell).text(vold.replace(val.substr(1,1),''));
        return;
    }
    var err = chkOne(cell, val, 1);
    // 
    if(err){
        setTimeout(()=>{$(cell).text(vold);}, 2300);
    }else{ 
        $(cell).text(val);
        $(cell).addClass('c1').unbind("click");
        classLog.unshift($(cell).prop('id')); 
        if(!inputFlg) setNop(); // TODO::
    }
}


// 试填N
function setNop(){ 
    var tds = $('#sdtab td'), v9 = '123456789';
    for(var j=0; j<81; j++){
        var cell = $(tds).eq(j), vn = $(cell).text(); 
        if($(cell).hasClass('c1')){ continue; }
        var ids = getIdxyb(cell), arr = ids.split(','), 
            err = 0, val = v9; //vn=='-' ? v9 : vn;
        for(var i=0;i<arr.length;i++){
            if(!arr[i]){ continue; }
            var ival = $('#'+arr[i]).text();
            if($('#'+arr[i]).hasClass('c1')){
                val = val.replace(ival,'');
            }
        }
        if(val.length==0){
            actCell(cell);
        }else if(val.length==1 && chkOne(cell,val)){
            break;
        }else{
            $(cell).text(val);
        } 
    }
    $('#btnvTip').show(); $('#btnhTip').hide();
    setInfo();
}

// 提示一次
function tipOne(){
    // init
    var tdn = 0, timer = 80;
    $('#btnvTip').hide(); $('#btnhTip').show();
    // single-cell(all)
    for(var i=0; i<81; i++){
        var cell = findOne(); 
        if(cell){ 
            actCell(cell); // TODO 优化
            var err = chkOne(cell, $(cell).text(), 1);
            if(err){ return; }
            if(!err){
                tdn++; timer = 800;
                $(cell).addClass('c1').unbind("click");
                classLog.unshift($(cell).prop('id'));
            }
        } else{ break; }
    } 
    // rel-cell(one)
    if(!tdn){
        var crow = findRel(); if(!crow){ return; } 
        var cell = $('#'+crow.id); 
        setTimeout(()=>{
            $(cell).hide(1200).unbind("click");
        }, 500);
        classLog.unshift(crow.id);
        setTimeout(()=>{
            actCell(cell);
            $(cell).text(crow.val).addClass('c1').show(500);
        }, 1500);
        timer = 1800;
    }
    // reset
    setTimeout(()=>{
        setNop();
    }, timer);
}

// 确认One
function findOne(){   
    var cell = $('#sdtab').find('td.act'), val = $(cell).text();
    if(val.length!=1 || val=='-' || $(cell).hasClass('c1')){ cell=null; }
    if(!cell){
        var tds = $('#sdtab td');
        for(var j=0; j<81; j++){
            var td = $(tds).eq(j), tv = $(td).text();
            if(tv.length!=1 || tv=='-' || $(td).hasClass('c1')){ continue; }
            cell = td; break;
        }
    } 
    return cell; 
}

// 试填Xyb
function findRel(ids){ 
    var cell = null;
    //
    var a0 = [1, 4, 7];
    for(var i=0; i<3; i++){
        for(var j=0; j<3; j++){
            var ids = getIdbox(a0[i]+'', a0[j]+'');
            cell = chkRel(ids); if(cell){ return cell; }
        }
    }
    //
    for(var i=1; i<10; i++){
        var ids1 = '', ids2 = '';
        for(var j=1; j<10; j++){
            ids1 += 'c'+i+''+j+',';
            ids2 += 'c'+j+''+i+',';
        }
        cell = chkRel(ids1); if(cell){ return cell; }
        cell = chkRel(ids2); if(cell){ return cell; }
    }
    //
    return cell;
}
// 试填Xyb
function chkRel(ids){ 
    var arr = ids.split(','), rel = {}, nul = null, cnt = 0;
    for(var i=0; i<10; i++){
        var valOrg = $('#'+arr[i]).text();
        if(valOrg.length<2){ continue; } 
        cnt++;
        for(var j=0; j<valOrg.length; j++){
            var num = valOrg.substr(j,1);
            if(num in rel){
                rel[num]['cnt']++;
                rel[num]['ids'] += ','+arr[i];
            }else{
                rel[num] = {'cnt':1, 'ids':arr[i], 'valOrg':valOrg};
            }
        }
    }
    if(cnt<2){ return nul; }
    for(let nk in rel){ 
        if(rel[nk]['cnt']==1){ console.log('chkRel:', arr, rel);
            var err = chkOne($('#'+rel[nk]['ids']), nk);
            if(!err){
                actList(arr, rel[nk]['ids'], 0);
                return {'id':rel[nk]['ids'], 'val':nk, 'valOrg':rel[nk]['valOrg']}
            }
        }
    }
    return nul;
}
// 检查一格
function chkOne(cell, val, act){ 
    var id = $(cell).prop('id'), ids = getIdxyb(cell), arr = ids.split(','), err = 0;
    for(var i=0; i<arr.length; i++){
        if(!arr[i] || arr[i]==id){ continue; }
        var ival = $('#'+arr[i]).text();
        if(ival+''==val+''){ 
            if(act){ actCell(arr[i]) }
            err++;
        }
    } 
    return err;
}


// 撤销One
function backOne(){   
    var id = classLog.shift(); 
    if(!id){ return; }
    $('#'+id).text('-').removeClass('c1').click(function(){
        optCell(this);
    });
    actCell(id);
}

// dataOps: imp, out, <auto>
function dataOps(act) {
    //
    if(act=='out'){
        var tds = $('#sdtab td'), str = '';
        for(var j=0; j<81; j++){
            var cell = $(tds).eq(j), val = $(cell).text();
            str += ($(cell).hasClass('c1') && val.length==1) ? val : '-';
        } 
        $('#data').val('{'+str+'}');
    }else if(act=='imp'){
        $('#data').val(''); 
        if(!picked){ 
            $.get(sudataUrl, function(sudata){ 
                for(let key in sudata){
                    let itm = sudata[key];
                    $("#pick").append("<option value='"+itm.data+"'>"+itm.name+" : "+key+"</option>");
                }
            }); 
            picked = 1;
        }
    }
    // 
    var doact = $('#drow').attr('rel'); 
    if(act=='do' && doact=='imp'){
        var data = $('#data').val();
        dataImp(data);
    }
    // 
    if(act=='do'){
        $('#drow').hide();
        $('#nums').show();
    }else{
        $('#drow').show().attr('rel', act);
        $('#nums').hide();
    }
}
// 导入数据
function dataImp(data){ 
    var tds = $('#sdtab td'), data = data.replace('{','').replace('}','');
    if(data.length!=81){ alert('数据格式不对,随机出题'); setGame(defLevel); return; }
    for(var j=0; j<81; j++){
        var cell = $(tds).eq(j), val = data.substr(j,1);
        if(val=='-'){
            $(cell).text('-').removeClass('c1').removeClass('c1Org').attr('rel', val);
            $(cell).click(function(){
                optCell(this);
            });
        }else{
            $(cell).text(val).addClass('c1').addClass('c1Org').removeAttr('rel').unbind("click");
        }
    }
    classLog = new Array();
    setInfo(); 
}
// 选数据
function dataPick(elm){ 
    var data = $(elm).val(); 
    dataImp(data); 
    $('#drow').hide();
    $('#nums').show();
    $(elm).val(0);
}

// 提示一列(高亮显示)
function actList(arr, id, i) {
    if(id!=arr[i]){ actCell(arr[i],100); }
    i++; if(i>10){ return; }
    setTimeout(()=>{ 
        actList(arr, id, i);
    }, i*13);
}

// 获取关联格IDs列表(x行,y栏,当前区)
function getIdxyb(cell) {
    if(!cell){ cell = $('#sdtab').find('td.act'); } 
    var id = $(cell).prop('id'), idx = id.substr(1,1), idy = id.substr(2,1), ids = ''; 
    for(var i=1; i<10; i++){ ids += 'c'+idx+i+','; } 
    for(var i=1; i<10; i++){ ids += 'c'+i+idy+','; } 
    ids += getIdbox(idx, idy); //console.log(id, idx, idy); console.log(ids); 
    return ids;
}
// 获取关联格IDs列表(x行,y栏所在区)
function getIdbox(x, y) {
    var tab = ['123', '456', '789'], ids = ''; // 147
    for(var i=0; i<3; i++){ if(tab[i].indexOf(x)>=0){ sx=tab[i]; } }
    for(var i=0; i<3; i++){ if(tab[i].indexOf(y)>=0){ sy=tab[i]; } }
    // 
    for(var i=0; i<3; i++){
        for(var j=0; j<3; j++){
            ids += 'c'+sx.substr(i,1)+sy.substr(j,1)+',';
        }
    } //console.log(ids);
    return ids;
}
// 选择一格(高亮)
function optCell(elm) {
    $('#sdtab td').removeClass('act');
    $(elm).addClass('act');
}
// 提示一格(高亮显示)
function actCell(td, time){
    var cell = typeof td == 'string' ? $('#'+td) : td;
    time = time ? time : 2300;
    $(cell).addClass('actTip'); 
    setTimeout(()=>{ $(cell).removeClass('actTip');}, 2300);
}

